package com.property.controller;

import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.mysql.jdbc.log.Log;

@Component("myAdvice")
@Aspect
public class MyAdvice extends HandlerInterceptorAdapter{
	Logger logger = Logger.getLogger(MyAdvice.class);
	String logStr = null;
	

//	@Pointcut("within(com..*) && !within(com.property.controller.LoginController)")
//	public void pointCut() {
//	}

//	@Around("pointCut()")
//	@Order(1)  
//	public Object trackInfo(ProceedingJoinPoint pjp) throws Throwable {
//		System.out.println(111);
//		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
//				.getRequestAttributes();
//		HttpServletRequest retValue = attributes.getRequest();
//		HttpServletResponse response = attributes.getResponse();
//		User user = (User) retValue.getSession().getAttribute("user");
//		if (user == null) {
//			logger.info("-------------用户未登陆-------------");
//			System.out.println(retValue.getContextPath());
//			response.sendRedirect(retValue.getContextPath()+"/login");
//			return "redirect:/login";
//		}else{
//			return pjp.proceed();
//		}
//	}
	
	// 定义切点
	@Pointcut("execution(* *.*(..))")
	public void sayings() {
	}

	/**
	 * 前置通知：在某连接点之前执行的通知，但这个通知不能阻止连接点前的执行
	 * 
	 * @param jp
	 *            连接点：程序执行过程中的某一行为
	 */
	@Before("sayings()")
	public void doBefore(JoinPoint jp) {
		logStr = jp.getTarget().getClass().getName() + "类的"
				+ jp.getSignature().getName() + "方法开始执行******Start******";
		logger.info(logger);
	}

	/**
	 * 环绕通知：包围一个连接点的通知，可以在方法的调用前后完成自定义的行为，也可以选择不执行。
	 * 类似web中Servlet规范中Filter的doFilter方法。
	 * @param pjp
	 *            当前进程中的连接点
	 * @return
	 */

	@Around("sayings()")
	@Order(2)
	public Object doAround(ProceedingJoinPoint pjp) {
		long Time = System.currentTimeMillis();
		Object result = null;
		try {
			result = pjp.proceed();
		} catch (Throwable e) {
			e.printStackTrace();
			logStr = "方法：" + pjp.getTarget().getClass() + "."
					+ pjp.getSignature().getName() + "()";
			logStr = logStr + "错误信息如下：[" + e + "]";
			logger.info(logStr);
		}
		return result;
	}

	/**
	 * 后置通知
	 * 
	 * @param jp
	 */
	@After("sayings()")
	public void doAfter(JoinPoint jp) {
		logStr = jp.getTarget().getClass().getName() + "类的"
				+ jp.getSignature().getName() + "方法执行结束******End******";
		logger.info(logStr);
	}
}
